<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>


//【示例1】当函数被绑定到指定对象上之后，将利用传递的参数执行函数，并返回函数的返回值。
function f(x,y){ 				// 定义一个简单的函数
    return x+y;
}
function o(a,b){ 				// 定义一个函数结构的伪对象
    return a*b;
}
alert(f.call(o,3,4)); 			// 返回7

function f(x,y){ 				// 定义一个简单的函数
    return x+y;
}
function o(a,b){ 				// 定义一个函数结构的伪对象
    return a*b;
}
o.m =f; 						// 为对象o定义一个方法m，该方法将调用函数f
alert(o.m(3,4)); 				// 返回7。调用对象o的方法m
delete o.m; 					// 删除对象o的方法m
//【示例2】apply()与call()方法功能和用法都相同，唯一的区别是它们传递给参数的方式不同。其中apply()是以数组形式传递参数，而call()方法以多个值的形式传递参数。针对上面示例，使用apply()方法来调用函数f，则设计代码如下所示：
function f(x,y){
    return x+y;
}
function o(a,b){
    return a*b;
}
alert(f.apply(o,[3,4])); 		// 返回7
//【示例3】设计把一个数组或伪类数组的所有元素作为参数进行传递时，使用apply()方法就非常便利。
function max(){						// 求最大值函数
    var m = Number.NEGATIVE_INFINITY; 		
		// 声明一个负无穷大的数值
    for( var i = 0; i < arguments.length; i ++ ){		 
		// 遍历函数所有的实参
        if( arguments[i] > m ) 			// 如果实参值大于变量m，
        m = arguments[i]; 				// 则把该实参值赋值给m
    }
    return m; 							// 返回最大值
}
var a = [23, 45, 2, 46, 62, 45, 56, 63]; 			
	// 声明并初始化数组
var m = max.apply( Object, a ); 	
	// 把函数max绑定为Object对象的方法，并动态调用
alert( m ); 							// 返回63
//【示例4】也可以把数组元素通过apply()方法传递给Math的max()方法来计算数组的最大值元素。
var a = [23, 45, 2, 46, 62, 45, 56, 63]; 	// 声明并初始化数组
var m = Math.max.apply( Object, a ); 		// 调用系统函数max
alert( m ); 								// 返回63
//【示例5】使用call()和apply()方法可以把一个函数转换为指定对象的方法，并在这个对象上调用该方法。这种行为只是临时的，函数实际上并没有作为对象的方法而存在，当函数被动态调用之后，这个对象的临时方法也会自动被注销。
function f(){}						// 定义空函数
f.call( Object ); 					// 把函数f绑定为Object对象的方法
Object.f();							// 再次调用该方法，则返回编译错误
//【示例6】call()和apply()方法能够动态改变函数内this指代的对象，这在面向对象编程中是非常有用的。下面示例使用call()方法不断改变函数内this指代对象，主要通过变换calll()方法的第一个参数值来实现。
var x = "o";				// 定义全局变量x，初始化为字符o
function a(){				// 定义函数类结构a
    this.x = "a";			// 定义函数内局部变量x，初始化为字符a
}
function b(){				// 定义函数类结构b
    this.x = "b";			// 定义函数内局部变量x，初始化为字符b
}
function c(){				// 定义普通函数，提示变量x的值
    alert( x );
}
function f(){				// 定义普通函数，提示当前指针所包含的变量x的值
    alert( this.x );
}
// 返回字符o，即全局变量x的值。this此时指向window对象
f();
// 返回字符o，即全局变量x的值。this此时指向window对象
f.call( window );
// 返回字符a，即函数a内部的局部变量x的值。this此时指向函数a
f.call( new a() );
// 返回字符b，即函数b内部的局部变量x的值。this此时指向函数b
f.call( new b() );
// 返回undefined，即函数c内部的局部变量x的值，但是该函数并没有定义x变量，
f.call( c );
//【示例7】在函数体内，call()和apply()方法的第一个参数就是调用函数内this的值。为了更好理解，用户可以看下面示例。
function f(){					// 定义函数类结构
    this.a ="a";				// 定义成员a并赋值，a为属性
    this.b = function(){		// 定义成员b并赋值，b为方法
        alert("b");
    }
}
function e(){					// 定义函数
    f.call(this); 				// 在函数体内动态调用函数f，this指代函数e
    alert(a); 					// 显示变量a的值
}
e()								// 返回字符串a
//【示例8】在下面示例中，使用apply()方法循环更改当前this指针，从而实现循环更改函数的结构。
function r( x ){ 				// 定义一个简单的函数
    return ( x );
}
// 定义一个稍复杂的函数，该函数将修改第一个参数值，并返回参数集合
function f( x ){
    x[0] = x[0] + ">";
    return x;
}
function o(){					// 循环更改函数r中返回值
    var temp = r;
    r = function(){
        return temp.apply( this, f( arguments ) );
    }
}
function a(){					// 定义函数a
    o();						// 调用函数o，修改函数r的结构，即返回值
    alert( r( "=" ) ); 					// 显示函数r的返回值
}
for( var i = 0 ; i < 10; i ++ ){ 		// 循环调用函数a
    a();
}



</script>
</head>
<body>
</body>
</html>
